package com.youlai.jdk;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * Java11新增特性
 * 引入了Epsilon垃圾收集器：Epsilon是一个新的垃圾收集器，它不会执行任何垃圾收集操作，而是简单地忽略垃圾收集请求。
 * 引入了ZGC垃圾收集器：ZGC是一个新的垃圾收集器，它可以在多个CPU内核上并行工作，从而提高了垃圾收集的效率。
 * 允许在lambda表达式的参数中使用var修饰符
 * @author zc
 * @date 2023-03-25 19:24
 */
public class Java11 {

    /**
     * Epsilon垃圾收集器的使用
     * 在启动时使用 Epsilon 垃圾回收器
     * java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC Test
     */

    /**
     * ZGC垃圾收集器的使用
     * 在启动时使用 ZGC 垃圾回收器
     * java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC Test
     */

    /**
     * 使用扩展的本地变量语法扩展
     */
    @Test
    public void localVariableSyntaxForLambdaParameters() {
        // 使用 var 关键字声明本地变量
        var list = new ArrayList<String>();
       // 使用扩展的语法声明本地变量
        List<String> myList = new ArrayList<>() {
            {
                add("Hello");
                add("world");
            }
        };
    }

    /**
     * 允许在lambda表达式的参数中使用var修饰符
     */
    @Test
    void varInLambdaParameters() {
        // 使用 var 关键字声明本地变量
        var list = new ArrayList<String>();
        // 使用扩展的语法声明本地变量
        List<String> myList = new ArrayList<>() {
            {
                add("Hello");
                add("world");
            }
        };
        // 使用 var 关键字声明 lambda 表达式的参数
        MyInterface myInterface = (var a, var b) -> {
            System.out.println(a + b);
        };
        myInterface.m1("Hello", 1);
    }

    @FunctionalInterface
    public interface MyInterface {
        void m1(String a, int b);
    }
}
